File:of Disk: Disks/MyPDP/m8-rka0-rkb0
(Source file text)
/LP.TK 21-MAY-80 /THIS TASK SERVES AS A LINEPRINTER BLOCKDRIVER. IT WRITES /THE DATA IN THE DISKFILE "SPOOL.LP" ON THE SYSTEM DISK. /INTERNAL IN THE TASK IS A SECOND TASK THAT MOVES THE DATA /FROM THE DISKFILE TO THE LINEPRINTER. /CONFIGURATION PARAMETERS: LOWER=LE8E&4000 LS8E=LE8E&2000 NSPOOL=LE8E&1000 KL8E=LE8E&400 WIDTH=LE8E&376 /MAXIMUM LINE LENGTH DKC8=LE8E&1 IFDEF DIABLO < IFZERO KL8E <LPERR,__ /DIABLO IS KL SERIAL >> IFDEF IBMPRO < IFZERO LS8E <LPERR,__ /IBMPRO IS INTELL >> IFDEF DIABLO < INTELL=1 > IFDEF IBMPRO < INTELL=1 > MASSDEV="S^100+"Y&3777 /NAME OF MASS STORAGE DEVICE UNIT=0 /UNIT NUMBER IFDEF SINGL8 < IFZERO LE8E&1 < /ALL THIS FOR ZM16 REPLACEABLE LPT'S *0 CDF 0 LPT^4+INT 6661 ///TEST LINEPRINTER FLAG *0 CDF 0 LPT^4+INT+2 6662 ///CLEAR PRINTER FLAG IFZERO LE8E&400 < ///FOR NORMAL INTERFACE *0 CDF 0 LPTER^4+INT 6663 ///SKIP ON LINEPRINTER ERROR *0 CDF 0 LPTER^4+INT+2 6667 ///DISABLE LPT INTERRUPTS > IFNZRO LE8E&400 < ///FOR KL8E INTERFACE *0 CDF 0 LPTER^4+INT 6651 ///SKIP ON INPUT FLAG *0 CDF 0 LPTER^4+INT+2 6652 ///CLEAR INPUT FLAG >> IFNZRO LE8E&1 < *0 CDF 0 LPT^4+INT 6570 ///SKIP ON FLAG *0 CDF 0 LPT^4+INT+2 NOP /// *0 CDF 0 LPTER^4+INT LPTER^4+INT+4&177+5200 ///NO ERRORS > /// > IFZERO NSPOOL < *200 REQ, "L^100+"P&3777 1200 /A FIVE-PAGE TASK XINIT, INIT /POINTER TO INITIALIZATION CODE AND BUFFER XRTV, RTV /POINTER TO READER TRANSFER VECTOR XTEST, TEST /ROUTINE TO TEST FOR ^Z AND ^Y XCLDTV, CLODTV /POINTER TO CLOSE BLOCK DESCRIPTOR LEN, 0 /NUMBER OF BLOCKS OF REQUEST LP, JMP I XINIT //GO INITIALIZE THIS TASK. OVERLAYED WITH: / SNA //CLOSE OR EXIT CALL FROM WRITER ? JMP SHUTUP //YES DCA REQ //STORE POINTER TO USERS REQUEST PARAMETERS DCA CLOSED //FILE IS NOW OPEN TAD (SIGNAL HALT DCA EXITS+1 //SETUP FOR PROPER RETURN LP1, JMS MONITOR RESERV RETURN CONTINUE DCA EVENT TAD I REQ //GET FUNCTION WORD SMA //WRITE ? JMP ERROR //NO, CAN'T READ FROM PRINTER AND C3700 //EXTRACT LENGTH BSW // CLL IAC RAR //ROUND UP TO BLOCKS CIA //MAKE NEGATIVE FOR COUNTING DCA LEN //LENGTH OF TRANSFER IN BLOCKS TAD I REQ //GET FUNCTION WORD AGAIN AND C70 //FIELD OF BUFFER TAD (4200+UNIT //WRITE 1 BLOCK DCA RTV //STORE IN READ TRANSFER VECTOR ISZ REQ TAD I REQ //GET CORE ADDRESS DCA RTV+1 /SEE IF THERE IS ENOUGH ROOM FOR THIS TRY, CLA CLL //13BIT COMPARISON AHEAD TAD COUNT //NUMBER OF BLOCKS OCCUPIED TAD MLNGTH //COUNT-LENGTH+1 SNL CLA //OK ? JMP GO //YES, PROCEED JMS MONITOR //NO, WAIT A WHILE STALL DGNTICK //1 SECOND JMP TRY //TRY AGAIN /TRANSFER THE DATA TO DISK NOW: GO, TAD FIRST TAD INBLK //THE CURRENT INPUT BLOCK# DCA RTV+2 CDTOIF / TAD XRTV JMS MONITOR CALL MASSDEV JMP .-3 /LOOP ON BUSY DCA EVNT1 JMS MONITOR WAIT EVNT1, 0 SZA CLA JMP ERROR /DISK WRITE LOCK ? CDTOIF TAD INBLK TAD MLNGTH /BLOCK-LENGTH+1 SZA /END OF FILE ? TAD LENGTH /NO, BLOCK+1 DCA INBLK ISZ COUNT /UPDATE COUNTER TAD RTV+1 TAD (400 /UPDATE THE BUFFER ADDRESS DCA RTV+1 JMS I XTEST /^Z IN BUFFER ? JMP .+3 /^Z: IGNORE THE REST OF THIS TRANSFER ISZ LEN /MORE TO DO ? JMP TRY /YES JMS MONITOR /START THE WRITER RUN TCBPW, 0 /GET TCBP OF WRITER TASK LPHRDE, HRDERR /OK, HE'S RUNNING ALREADY EXITS, JMS MONITOR SIGNAL HALT EVENT, 0 ERROR, TAD LPHRDE JMP EXITS SHUTUP, TAD CLOSED SNA CLA //FILE OPEN ? JMP CLOSE //YES, MUST BE CLOSE TAD M4 TAD TCBPW DCA X CDF 0 TAD I LPHEAD DCA I X TAD X DCA I LPHEAD DCA I PNAME //CLEAR NAME TABLE ENTRY ACM1 JMS MONITOR EXIT SWPOUT CLOSE, ISZ CLOSED TAD (SIGNAL HALT CLEAR DCA EXITS+1 /ADD CLEAR FOR FINAL RETURN TAD XCLDTV DCA REQ CDTOIF JMP LP1 /WRITE CLOSE BLOCK IN THE SPOOL FILE END, JMS MONITOR /THIS PIECE BELONGS TO 'WRITER' RUN "L^100+"P&3777 LPHEAD, FHEAD /PAGE ZERO LOC = NOP JMS MONITOR EXIT CLOSED, 0 MLNGTH, 0 /-LENGTH+1 LENGTH, 0 /LENGTH OF FILE FIRST, 0 INBLK, 0 COUNT, 0 PNAME, 0 RTV, ZBLOCK 3 CLODTV, ZBLOCK 3 PAGE YMLNGTH,MLNGTH YLENGTH,LENGTH YPRINT, PRINT YCOUNT, COUNT YFIRST, FIRST YTCBPW, TCBPW YEND, END YBUF, BUFFER YWTV, WTV YRTV, RTV YRTV1, RTV+1 YSKIPF, SKIPF OUTBLK, 0 /THE OUTPUT WRITER. A SEPARATE TASK CREATED BY THE INITIALIZATION WRITER, JMS MONITOR /TEST THE BREAK FLAG BREAK 0 SKP / JMP WRITR1 /NOT SET, CONTINUE ACM1 /SET, SET SKIP FLAG TO SKIP THE REST DCA I YSKIPF /OF THIS FILE WRITR1, CDTOIF TAD I YCOUNT /ANYTHING IN FILE SNA CLA JMP I YEND /NOTHING TO DO TAD I YFIRST TAD OUTBLK DCA WTV+2 /ACTUAL BLOKNUMBER TAD YWTV JMS MONITOR CALL MASSDEV JMP .-3 /LOOP ON BUSY DCA .+3 JMS MONITOR WAIT 0 CLA CLL /NO ERRORS EXPECTED CDTOIF JMS PRNT /OUTPUT THE STUFF ACM1 TAD I YCOUNT DCA I YCOUNT /UPDATE THE COUNTER TAD OUTBLK TAD I YMLNGTH /BLOCK-LENGTH+1 SZA /END OF FILE ? TAD I YLENGTH /NO, BLOCK+1 DCA OUTBLK JMP WRITER /MORE, CHECK BREAK FLAG FIRST TEST, 0 /ROUTINE TO SCAN BUFFER FOR ^Z CDTOIF TAD (-401 TAD I YRTV1 DCA AUTO10 /ADDRESS OF BUFFER TAD M200 DCA X /COUNTER TAD I YRTV CDTOAC /CDF TO FIELD OF BUFFER TEST1, TAD I AUTO10 MQL /SAVE WORD CLA MQA /GET WORD TAD (-232 AND C177 SNA CLA /^Z ? JMP TEST2 /YES, NON-SKIP RETURN OF TEST CLA MQA /GET WORD AGAIN AND (3400 TAD M400 SNA CLA /CHAR IN RANGE 220 - 237 ? ACM1 /SET FLAG FOR NEXT BYTE DCA FLAG TAD I AUTO10 MQL CLA MQA TAD (-232 AND C177 SNA CLA JMP TEST2 ISZ FLAG /NEED TO TEST HIGH BYTE ? JMP TEST3 /NO MQA /GET WORD AGAIN AND C7400 /HIGH ORDER 4 BITS TAD (-5000 / SNA CLA /PART OF ^Z ? JMP TEST2 /YES, END OF FILE DETECTED ! TEST3, ISZ X /NO, ALL BUFFER DONE ? JMP TEST1 /NO, CYCLE ISZ TEST /YES, NO ^Z IN THIS BUFFER (SKIP) TEST2, CDTOIF /RETURN WITH NORMAL DATA FIELD JMP I TEST /RETURN PRNT, 0 TAD M200 DCA LPWC TAD YBUF DCA LPCA LPLOOP, JMS LPSUB CLL RTR DCA PRNTEM JMS LPSUB //SOME RECURRING INSTRUCTIONS BSW TAD PRNTEM CLL RTR JMS I YPRINT ISZ LPWC JMP LPLOOP LPFINI, JMP I PRNT /RETURN LPSUB, 0 TAD I LPCA JMS I YPRINT TAD I LPCA AND C7400 ISZ LPCA JMP I LPSUB JMP I LPSUB PRNTEM, 0 LPCA, 0 LPWC, 0 FLAG, 0 WTV, ZBLOCK 3 PAGE ULFINI, LPFINI /0 PRINT, 0 AND (377 DCA LPCHAR /SAVE 8-BIT CHAR TAD SKIPF //SKIP THIS FILE? SZA CLA JMP I PRINT //YES, FLUSH TAD LPCHAR AND C177 IFNDEF INTELL < SZA //SKIP NULL'S TAD M177 SNA JMP I PRINT //IGNORE RUBOUTS TAD (177-33 > IFDEF INTELL < TAD (-33 > SNA /ESCAPE ? JMP LPESC /SPECIAL HANDLING? IAC SNA JMP I ULFINI //^Z: IGNORE THE REST OF THE BUFFER IAC SNA JMP LPEXIT //^Y: END OF FILE TAD (31-15 SNA JMP CRLF //CR OR LF IAC SNA JMP FF //14 FF TAD C2 //(14-12 SNA JMP CRLF //LINE FEED IFNDEF INTELL < IAC //TAD (12-11 K7640, SZA CLA JMP NOTAB LPTAB, TAD C240 JMS LPOUT //PRINT SPACE ISZ POS TAD POS AND C7 K7740, SZA CLA SMA JMP LPTAB JMP I PRINT LPESC, TAD (244 /PUT $ FOR ESC DCA LPCHAR > NOTAB, CLL STA // DCA FFFLG //FORMFEEDS ALLOWED FROM NOW TAD POS LF, TAD (-WIDTH SMA JMP LFEXTR TAD (WIDTH+1 //INCREMENT POS CRLF, DCA POS //RESET POS FOR CR AND LF IFDEF INTELL < LPESC, > TAD LPCHAR IFZERO LOWER < //IF YOUR LPT CAN'T HANDLE L.C. TAD K7640 SMA TAD K7740 TAD (340 / > JMS LPOUT IFDEF DIABLO < ISZ DIACNT /BUFFER FULL ? > JMP I PRINT IFDEF DIABLO < TAD M200 /HALF BUFFER DCA DIACNT /RESET COUNTER AC0003 /SEND ETX JMS LPOUT AC0001 LIION /ENABLE INTENA TAD (-DGNTICK^20/16 SECONDS FOR FF BUT JMS MONITOR /SHOULD ANSWER IN 1-2 SECONDS WAIT LPTER /BACK CHANNEL FROM KL CLA /IGNORE TIMOUT JMP I PRINT / > LFEXTR, M177, 7601 /CLA TAD C215 JMS LPOUT TAD C212 JMS LPOUT //GIVE EXTRA CR-LF JMP LF FF, JMS MONITOR /TEST THE BREAK FLAG BREAK 0 JMP LPZAP /SET, SET SKIP FLAG TO SKIP THE REST ISZ FFFLG //FORMFEED NECESARY ? JMP I PRINT //NO IFDEF INTELL < JMP CRLF // > IFNDEF INTELL < IFZERO KL8E < JMP CRLF // > IFNZRO KL8E < TAD LPCHAR //FORMFEED OUT JMS LPOUT TAD M100 //NOW INITIALIZE COUNTER TO 64 DCA POS //POS IS TO BE RESET ANYWAY JMS LPOUT //GIVE SOME NULLS FOR DELAY ISZ POS // JMP .-2 //ALL 64 JMP I PRINT // >> LISKIP=6661 LILOAD=6666 LIION=6665 /AC0001 LIIOF=6665 /AC0000 IFZERO LS8E < LIIOF=6667 > IFNZRO KL8E < LIKLDV=6650 LISKIP=LIKLDV+11 LIION=LIKLDV+5 /AC0001 LIIOF=LIKLDV+5 /AC0000 LILOAD=LIKLDV+16 > IFNZRO DKC8 < LISKIP=6570 LIION=6575 LIIOF=6576 LILOAD=6574 > IFNZRO IBMPRO < LIIOF=6000+IBMPRO LIION=6001+IBMPRO LISKIP=6002+IBMPRO LICI=6003+IBMPRO LIRI=6004+IBMPRO LICO=6005+IBMPRO LISO=6006+IBMPRO LIRO=6007+IBMPRO > LPOUT, 0 AND C177 /SOME LINEPRINTERS LIKE THIS IOF ///AVOID PROBLEMS DCA LPTMP ///SAVE THE CHARACTER LPQUICK, IFNDEF IBMPRO < LISKIP ///IS THE FLAG UP ALREADY (STILL) SKP /// > IFDEF IBMPRO < LIRI ///READ INPUT SPA CLA /// PRINTER READY ? > JMP LPFAST ///YES, HURRY ON ION ///INTERRUPTS ON AGAIN AC0001 /FOR SOME IOTS LIION /ENABLE PRINTER INT'S TAD (-DGNTICK /DELAY 1 SECOND JMS MONITOR WAIT LPT SZA CLA /WAS THERE A TIME-OUT ? JMP LPTIMO /YES LPFAST, LIIOF /DISABLE INTERRUPTS TAD LPTMP IFNZRO DKC8 < CMA /DKC8AA IS FUNNY > LILOAD /PRINT THE CHARACTER, CLEAR THE FLAG ION CLA / JMP I LPOUT LPTIMO, LIIOF /TURN OFF LP INTENA IOF /AND PDP8 INTENA LILOAD /KICK LP AGAIN TO KEEP IT ALIVE AND I 0 AND I 0 AND I 0 /DELAY 20MMS JMP LPQUICK /AND CHECK FOR QUICK FLAG LPZAP, ACM1 /SET THE SKIPFLAG LPEXIT, DCA SKIPF /RESET THE SKIPFLAG TAD C215 JMS LPOUT TAD (214 JMS PRINT STA DCA FFFLG /ALLOW FF FOR NEXT JOB JMP I ULFINI IFDEF DIABLO < DIACNT, -200 /HALF OF 256 CHAR BUFFER > SKIPF, 0 POS, 0 FFFLG, -1 LPTMP, 0 LPCDF, 0 LPCHAR, 0 K231, 231 /FIRST WORD OF ^Y BUFFER PAGE BUFFER, /INIT AND BUFFER ZFILE, FILE ZTCBPW, TCBPW /ARGUMENT IN RUN-REQUEST ZWRITER,WRITER /START ADDRESS OF WRITER TASK ZFIRST, FIRST ZMLNGTH,MLNGTH ZLENGTH,LENGTH ZLP, LP ZBUF, BUFFER ZWTV, WTV ZWTV1, WTV+1 ZCLDTV, CLODTV ZCLDT1, CLODTV+1 ZK231, K231 ZNAME, PNAME 0 INIT, SNA //CLOSE ? JMP INCLOSE //YES, THATS EASY DCA INIT //SAVE POINTER TO REQUEST PARAMETERS TAD I ZMYCDF //CDF TO PARAMETERS DCA CDF1 CDTOIF TAD ZFILE /POINTER TO FILE LOOKUP REQUEST BLOCK JMS MONITOR CALL "D^100+"I&3777 JMP .-3 SZA CLA JMP INERROR /*** SPOOL.LP NOT FOUND *** TAD FILE+2 CIA DCA I ZLENGTH /LENGTH OF SPOOLFILE TAD FILE+2 IAC DCA I ZMLNGTH /-LENGTH+1 TAD FILE+4 DCA I ZFIRST /STARTBLOCK OF SPOOLFILE INIT1, CDF 00 TAD I (FHEAD SNA JMP WAITS /NO BLOCKLET AVAILABLE JMS DEFER DCA I (FHEAD TAD X TAD (-TCBTAB /COMPUTE NAMETABLE ENTRY CLL RTR RAR TAD (NAMLST DCA ZTEM1 /POINTS IN NAMLST TAD ("P^100+"S&3777 DCA I ZTEM1 /DROP "PS" AS NAME FOR SPOOL WRITER ACM1 TAD X DCA AUTO10 DCA I AUTO10 /ZERO BACKLINK DCA I AUTO10 /ZERO THREAD TAD ZWRITER DCA I AUTO10 /START ADDRESS DCA I AUTO10 /ZERO BLOCKNUMBER RIF DCA I AUTO10 /INSTRUCTION FIELD TAD AUTO10 CDTOIF DCA I ZTCBPW /TCBP OF WRITER TASK TAD ZTEM1 / DCA I ZNAME /AND GIVE SHUTUP A POINTER TO REMOVE IT TAD (200+UNIT RIF DCA I ZWTV TAD ZBUF DCA I ZWTV1 TAD (4200 /WRITE ONE BLOCK RIF /FROM THIS FIELD DCA I ZCLDTV /THAT'S THE FUNCTION FOR CLOSE TAD ZK231 /ADDRESS OF K231 DCA I ZCLDT1 /THAT'S THE BUFFER ADDRESS FOR CLOSE RET, TAD (SNA DCA I ZLP /PATCH FIRST INSTRUCTION OF TASK CDF1, CDF // TAD INIT JMP I ZLP //START THE TASK WAITS, JMS MONITOR STALL DGNTICK CLA CLL JMP INIT1 INCLOSE,ACM1 JMS MONITOR EXIT SWPOUT INERROR,TAD (-HRDERR-1 JMS MONITOR EXIT SWPOUT FILE, MASSDEV /NAME OF DEVICE HANDLER UNIT /UNIT NUMBER FILENAME SPOOL.LP /FILENAME PAGE / > IFNZRO NSPOOL < *200 LPCA, "L^100+"P&3777 200 LPCHAR, 0 LP, SNA //CLOSE ? JMP LPCLOSE // JMS DEFER //GET FUNCTION WORD AND C3700 //GET LENGTH BITS CIA /WORDCOUNT IS NEGATIVE DCA LPWC TAD I X /GET FIELDBITS AND C70 TAD C6201 DCA LPCDF ISZ X //ADVANCE POINTER TO BUFFERADDRESS TAD I X DCA LPCA //SET UP CURRENT ADDRESS JMS MONITOR RESERV RETURN CONTINUE DCA LPSLOT /EVENT # FOR COMPLETION LPCDF, CDF //OVERLAID WITH CDF TO BUFFER FIELD LPLOOP, JMS LPSUB DCA LPCDF JMS LPSUB //SOME RECURRING INSTRUCTIONS CLL RTR RTR TAD LPCDF //ADD IN HIGHORDER BITS RTR RTR JMS PRINT ISZ LPWC JMP LPLOOP LPEND, JMS MONITOR C14, SIGNAL HALT LPSLOT, 0 LPSUB, 0 TAD I LPCA JMS PRINT TAD I LPCA AND C7400 ISZ LPCA NOP /PROTECT ISZ JMP I LPSUB LPCLOSE,TAD C215 JMS LPOUT TAD C14 JMS PRINT / ACM1 JMS MONITOR EXIT SWPOUT PRINT, 0 AND C177 TAD (-33 SNA /ESCAPE ? TAD (44-33 /YES, MAKE "$ TAD (33 DCA LPCHAR TAD LPCHAR SZA //SKIP NULL'S TAD M177 SNA JMP I PRINT //IGNORE RUBOUTS TAD (377-232 SNA JMP LPEND //^Z TAD (232-214 SNA JMP FF //FORM FEED TAD M1 //(214-215 SZA TAD C3 //(215-212 SNA JMP CRLF //LINE FEED IAC //TAD (212-211 K7640, SZA CLA JMP NOTAB LPTAB, TAD C240 JMS LPOUT //PRINT SPACE ISZ POS TAD POS AND C7 K7740, SZA CLA SMA JMP LPTAB JMP I PRINT C340, NOTAB, 7340 /CLL STA DCA FFFLG //FORMFEEDS ALLOWED FROM NOW TAD POS LF, TAD (-WIDTH SMA JMP LFEXTR TAD (WIDTH+1 //INCREMENT POS CRLF, DCA POS //RESET POS FOR CR AND LF TAD LPCHAR IFZERO LOWER < //IF YOUR LPT CAN'T HANDLE L.C. TAD K7640 SMA TAD K7740 TAD C340 / > JMS LPOUT JMP I PRINT LFEXTR, M177, 7601 /CLA TAD C212 JMS LPOUT //GIVE EXTRA LF JMP LF FF, ISZ FFFLG //FORMFEED NECESSARY ? JMP I PRINT //NO JMP CRLF LPOUT, 0 DCA LPTMP IFZERO DKC8 <AC0001 IFZERO KL8E <6665 /SET INTERRUPT ENABLE >> IFNZRO KL8E <6655 /SET INTERRUPT ENABLE > IFNZRO DKC8 <6575 /SET INTERRUPT ENABLE > JMS MONITOR WAIT LPT TAD LPTMP IFZERO DKC8 <6666 / > IFNZRO DKC8 <CMA 6574 6577 / > CLA JMP I LPOUT LPWC, 0 POS, 0 FFFLG, 0 LPTMP, 0 PAGE /END IFNZRO NSPOOL > $